const TYPE_MAP = {
  // 图片类型
  Image: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'psd'],
  // 视频类型
  Video: ['mp4', 'mov', 'avi', 'mkv', 'flv', 'mpeg', 'webm', '3gp', 'wmv', 'video'],
  // 音频类型
  Audio: ['mp3', 'wav', 'ogg', 'aac', 'flac', 'm4a', 'midi', 'wma'],
  // 文档类型
  Document: [
    'pdf',
    'doc',
    'docx',
    'xls',
    'xlsx',
    'ppt',
    'pptx',
    'txt',
    'rtf',
    'md',
    'csv',
    'odt',
    'epub',
  ],
  // 压缩文件
  Archive: ['zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz', 'dmg', 'iso'],
  // 可执行文件
  Executable: ['exe', 'msi', 'apk', 'bat', 'sh', 'app', 'pkg'],
  // 编程文件
  Code: ['js', 'html', 'css', 'py', 'java', 'cpp', 'php', 'json', 'xml', 'sql'],
  // 字体文件
  Font: ['ttf', 'otf', 'woff', 'woff2'],
  // 矢量图形
  Vector: ['ai', 'eps', 'svg'],
  // 3D模型
  Model3D: ['stl', 'obj', 'fbx', 'blend'],
  // 电子书
  Ebook: ['mobi', 'azw', 'azw3'],
  // 系统文件
  System: ['dll', 'sys', 'ini', 'cfg'],
  // 数据文件
  Data: ['db', 'sqlite', 'csv', 'tsv', 'dat'],
}

function linkType(src, fn) {
  // 将输入统一转换为数组（支持字符串、对象数组、单个对象等多种格式）
  const _src = Array.prototype.concat.call([], src)
  const types = []
  const _this = this

  _src.forEach((item) => {
    try {
      // 使用自定义函数获取链接，若没有则直接使用元素本身
      let link = fn && typeof fn === 'function' ? fn.call(_this, item) : item

      // 处理非常规输入情况（如数字、布尔值等）
      if (typeof link !== 'string') link = String(link)

      // 移除URL中的查询参数和哈希部分
      const cleanLink = link.split(/[#?]/)[0]

      // 获取扩展名（支持多级扩展如.tar.gz）
      const extension = cleanLink.includes('.') ? cleanLink.split('.').pop().toLowerCase() : ''

      // 遍历类型字典进行匹配
      let foundType = 'Unknown'
      for (const [type, exts] of Object.entries(TYPE_MAP)) {
        if (exts.includes(extension)) {
          foundType = type
          break // 确保优先匹配
        }
      }

      types.push(foundType)
    } catch {
      // 异常处理（如无法解析的输入）
      types.push('Invalid')
    }
  })

  return types
}

export default linkType
